package top.lixunda.ecommerce.server.good.api.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import top.lixunda.commerce.common.core.entity.MessageObject;
import top.lixunda.common.validate.XumValid;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageConvertDTO;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodConvertVO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodDetailDO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodsDO;
import top.lixunda.ecommerce.server.good.api.entity.dto.GoodDetailQueryDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.StoreRelatedProductDTO;

/**
 * @author Xumda
 * @version time:2019/12/27 15:46
 * <p>
 * 商品详细信息，包括分类数据
 */
@SuppressWarnings("unused")
@Api("商品详细信息，包括分类数据")
@RequestMapping("/good_detail")
public interface IGoodDetailController {

    /**
     * 用户调用，根据id获取商品数据,只能查询普通用户可见的商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @ApiOperation("用户调用，根据id获取商品数据,只能查询普通用户可见的商品信息")
    @GetMapping("/queryById")
    MessageObject<GoodConvertVO> queryById(@RequestParam("id") Integer id);

    /**
     * 用户调用，根据条件筛选商品信息，只能查询普通用户可见的商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    @ApiOperation("用户调用，根据条件筛选商品信息，只能查询普通用户可见的商品信息")
    @PostMapping("queryGoodDetailByPage")
    MessageObject<IPage<GoodConvertVO>> queryGoodDetailByPage(
            @RequestBody @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO);

    /**
     * 店家调用，根据id获取商品数据,只能查询本店铺的所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @ApiOperation("店家调用，根据id获取商品数据,只能查询本店铺的所有商品信息")
    @GetMapping("/queryByIdStore")
    MessageObject<GoodConvertVO> queryByIdStore(@RequestParam("id") Integer id);

    /**
     * 店家调用，根据条件筛选商品信息，只能查询本店铺的所有商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    @ApiOperation("店家调用，根据条件筛选商品信息，只能查询本店铺的所有商品信息")
    @PostMapping("queryGoodDetailByPageStore")
    MessageObject<IPage<GoodConvertVO>> queryGoodDetailByPageStore(
            @RequestBody @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO);

    /**
     * 后台管理员调用，根据id获取商品数据,查询所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @ApiOperation("后台管理员调用，根据id获取商品数据,查询所有商品信息")
    @GetMapping("/queryByIdAdmin")
    MessageObject<GoodConvertVO> queryByIdAdmin(@RequestParam("id") Integer id);

    /**
     * 后台管理员调用，根据条件筛选商品信息，查询所有商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    @ApiOperation("后台管理员调用，根据条件筛选商品信息，查询所有商品信息")
    @PostMapping("queryGoodDetailByPageAdmin")
    MessageObject<IPage<GoodConvertVO>> queryGoodDetailByPageAdmin(
            @RequestBody @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO);

    /**
     * 查询新商品，分页查询，不包含条件，用户端调用
     *
     * @param pageDTO 分页数据
     * @return 商品列表
     */
    @ApiOperation("查询新商品，分页查询，不包含条件，用户端调用")
    @PostMapping("queryNewProductsPage")
    MessageObject<IPage<GoodConvertVO>> queryNewProductsPage(
            @RequestBody @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, ?> pageDTO);

    /**
     * 查询某个店铺中的最新的商品的商品，用户端调用，不包含条件
     *
     * @param pageDTO 分页数据，不包含条件
     * @return 商品列表
     */
    @ApiOperation("查询某个店铺中的最新的商品的商品，用户端调用，不包含条件")
    @PostMapping("queryStoreRelatedProductPage")
    MessageObject<IPage<GoodConvertVO>> queryStoreRelatedProductPage(
            @RequestBody @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, StoreRelatedProductDTO> pageDTO);

}
